home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / UCB Logo 3.0 / CSLS / solitaire < prev    next >
Text File  |  1993-08-05  |  10KB  |  524 lines

  1. TO ASKDIGIT
  2. MAKE "ONTO LIST "PLAYONTO :CHAR
  3. END
  4.  
  5. TO ASKPARSE :CHAR
  6. IF EQUALP :CHAR "U [ASKU STOP]
  7. IF MEMBERP LIST "PLAYONTO :CHAR :ONTO [ASKDIGIT STOP]
  8. BELL
  9. ASKPARSE RC
  10. END
  11.  
  12. TO ASKSTACKS :LIST
  13. IF EMPTYP :LIST [TYPE [FOR STACK] STOP]
  14. IF EQUALP FIRST FIRST :LIST "PLAYTOP [ASKUP STOP]
  15. SPBTYPE 0 LAST FIRST :LIST
  16. TYPE "| |
  17. ASKSTACKS BF :LIST
  18. END
  19.  
  20. TO ASKU
  21. IFELSE EQUALP FIRST LAST :ONTO "PLAYTOP ~
  22.        [MAKE "ONTO LAST :ONTO] [BELL ASKPARSE RC]
  23. END
  24.  
  25. TO ASKUP
  26. TYPE [FOR STACK,]
  27. SETCURSOR [4 21]
  28. TYPE "OR
  29. SPBTYPE 1 "U
  30. TYPE [| FOR| UP.]
  31. END
  32.  
  33. TO ASKWHICH
  34. SETCURSOR [1 20]
  35. TYPE [PLAY WHERE? |TYPE |]
  36. ASKSTACKS :ONTO
  37. ASKPARSE RC
  38. SETCURSOR [1 20]
  39. SPACES 37 PR []
  40. SPACES 37 PR []
  41. END
  42.  
  43. TO BELL
  44. TONE 400 10
  45. SETEMPTY "DIGIT
  46. END
  47.  
  48. TO BLACKTYPE :WORD
  49. TYPE STANDOUT :WORD
  50. END
  51.  
  52. TO CARDBEFOREP :A :B
  53. IF EQUALP :A "A [OUTPUT EQUALP :B 2]
  54. IF EQUALP :A 10 [OUTPUT EQUALP :B "J]
  55. IF EQUALP :A "J [OUTPUT EQUALP :B "Q]
  56. IF EQUALP :A "Q [OUTPUT EQUALP :B "K]
  57. IF EQUALP :A "K [OUTPUT "FALSE]
  58. IF NOT NUMBERP :B [OUTPUT "FALSE]
  59. OUTPUT EQUALP :A :B-1
  60. END
  61.  
  62. TO CARDDIS :CARD
  63. IFELSE MEMBERP SUIT :CARD :REDS [REDTYPE :CARD] [BLACKTYPE :CARD]
  64. TYPE "| |
  65. wait 0
  66. END
  67.  
  68. TO CHEAT
  69. SETCURSOR [1 22] SPACES 3
  70. IF NOT EQUALP :DIGIT 8 [BELL STOP]
  71. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  72. LPUSH DEAL "PILE
  73. DISPILE
  74. DISHAND
  75. SETEMPTY "DIGIT
  76. END
  77.  
  78. TO CHECKBLACK :NUM
  79. IF NOT MEMBERP SUIT FIRST :STACK :REDS [STOP]
  80. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  81.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  82. END
  83.  
  84. TO CHECKEMPTY :NUM
  85. IF EQUALP RANK :CARD "K [PUSH (LIST "PLAYONTO :NUM) "ONTO OUTPUT "TRUE]
  86. OUTPUT "FALSE
  87. END
  88.  
  89. TO CHECKFULL :NUM :STACK
  90. IFELSE MEMBERP SUIT :CARD :REDS [CHECKRED :NUM] [CHECKBLACK :NUM]
  91. END
  92.  
  93. TO CHECKONTO :NUM
  94. IF :NUM = 0 [STOP]
  95. IFELSE STACKEMPTYP SHOWN :NUM ~
  96.        [IF CHECKEMPTY :NUM [STOP]] [CHECKFULL :NUM THING SHOWN :NUM]
  97. CHECKONTO :NUM-1
  98. END
  99.  
  100. TO CHECKRED :NUM
  101. IF MEMBERP SUIT FIRST :STACK :REDS [STOP]
  102. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  103.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  104. END
  105.  
  106. TO CHECKTOP
  107. IF EQUALP RANK :CARD "A ~
  108.    [IF EMPTYP TOP SUIT :CARD ~
  109.        [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO] ~
  110.     STOP]
  111. IF CARDBEFOREP (TOP SUIT :CARD) (RANK :CARD) ~
  112.    [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO]
  113. END
  114.  
  115. TO COVEREDP
  116. IF EQUALP :WHERE [REMPILE] [OUTPUT "FALSE]
  117. OUTPUT NOT EQUALP :CARD FIRST THING SHOWN LAST :WHERE
  118. END
  119.  
  120. TO DEAL
  121. IF EMPTYP :HAND [MAKE "HAND :PILE SETEMPTY "PILE]
  122. IF EMPTYP :HAND [OUTPUT []]
  123. OUTPUT SPOP "HAND
  124. END
  125.  
  126. TO DECK
  127. if namep "newdeck [op :newdeck]
  128. make "newdeck (array 52 0)
  129. foreach [A 2 3 4 5 6 7 8 9 10 J Q K] ~
  130.    [setitem #-1 :newdeck word ? :heart ~
  131.     setitem #+12 :newdeck word ? :spade ~
  132.     setitem #+25 :newdeck word ? :diamond ~
  133.     setitem #+38 :newdeck word ? :club]
  134. output :newdeck
  135. END
  136.  
  137. TO DISHAND
  138. SETCURSOR [27 23]
  139. TYPE COUNT :HAND
  140. TYPE "| |
  141. END
  142.  
  143. TO DISPILE
  144. SETCURSOR [32 23]
  145. IFELSE EMPTYP :PILE [SPACES 3] [CARDDIS LAST :PILE]
  146. END
  147.  
  148. TO DISSTACK :NUM
  149. SETCURSOR LIST (-3+5*:NUM) 4
  150. TYPE IFELSE STACKEMPTYP HIDDEN :NUM ["| |] ["-]
  151. IF STACKEMPTYP SHOWN :NUM ~
  152.    [SETCURSOR LIST (-4+5*:NUM) 5 SPACES 3 STOP]
  153. DISSTACK1 :NUM (THING SHOWN :NUM)
  154. END
  155.  
  156. TO DISSTACK1 :NUM :STACK
  157. DISSTACK2 (4+COUNT :STACK) (-4+5*:NUM) :STACK
  158. END
  159.  
  160. TO DISSTACK2 :ROW :COL :STACK
  161. IF EMPTYP :STACK [STOP]
  162. SETCURSOR LIST :COL :ROW
  163. CARDDIS FIRST :STACK
  164. DISSTACK2 :ROW-1 :COL BF :STACK
  165. END
  166.  
  167. TO DISSTACKS :NUM
  168. IF :NUM = 0 [STOP]
  169. DISSTACK :NUM
  170. DISSTACKS :NUM-1
  171. END
  172.  
  173. TO DISTOP :SUIT
  174. IF EMPTYP TOP :SUIT [STOP]
  175. IF EQUALP :SUIT :HEART [DISTOP1 4 STOP]
  176. IF EQUALP :SUIT :SPADE [DISTOP1 11 STOP]
  177. IF EQUALP :SUIT :DIAMOND [DISTOP1 18 STOP]
  178. DISTOP1 25
  179. END
  180.  
  181. TO DISTOP1 :COL
  182. SETCURSOR LIST :COL 2
  183. CARDDIS WORD (TOP :SUIT) :SUIT
  184. END
  185.  
  186. TO FINDCARD
  187. IF FINDPILE [STOP]
  188. MAKE "WHERE FINDSHOWN 7
  189. IF EMPTYP :WHERE [BELL]
  190. END
  191.  
  192. TO FINDPILE
  193. IF EMPTYP :PILE [OUTPUT "FALSE]
  194. IF EQUALP :CARD LAST :PILE [MAKE "WHERE [REMPILE] OUTPUT "TRUE]
  195. OUTPUT "FALSE
  196. END
  197.  
  198. TO FINDSHOWN :NUM
  199. IF :NUM = 0 [OUTPUT []]
  200. IF MEMBERP :CARD THING SHOWN :NUM [OP SE "REMSHOWN :NUM]
  201. OP FINDSHOWN :NUM-1
  202. END
  203.  
  204. TO HAND3
  205. IF NOT EMPTYP :DIGIT [BELL STOP]
  206. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  207. LPUSH DEAL "PILE
  208. REPEAT 2 [IF NOT EMPTYP :HAND [LPUSH DEAL "PILE]]
  209. DISPILE
  210. DISHAND
  211. END
  212.  
  213. TO HELP
  214. CT
  215. INSTRUCT
  216. SPBPR 0 [TYPE ANY KEY TO CONTINUE]
  217. IGNORE RC
  218. REDISPLAY
  219. END
  220.  
  221. TO HIDDEN :NUM
  222. OUTPUT WORD "HIDDEN :NUM
  223. END
  224.  
  225. TO INITHIDDEN :NUM [:name hidden :num]
  226. SETEMPTY :name
  227. REPEAT :NUM [PUSH DEAL :name]
  228. END
  229.  
  230. TO INITSTACKS :NUM
  231. IF :NUM = 0 [STOP]
  232. INITHIDDEN :NUM
  233. TURNUP :NUM
  234. INITSTACKS :NUM-1
  235. END
  236.  
  237. TO INSTRUCT
  238. PR [WELCOME TO SOLITAIRE]
  239. PR []
  240. PR [HERE ARE THE COMMANDS YOU CAN TYPE:]
  241. SPBTYPE 4 "+ SPPR 4 [DEAL THREE CARDS ONTO PILE]
  242. SPBTYPE 4 "P SPPR 4 [PLAY TOP CARD FROM PILE]
  243. SPBTYPE 4 "R SPPR 4 [REDISPLAY THE BOARD]
  244. SPBTYPE 4 "? SPPR 4 [RETYPE THESE INSTRUCTIONS]
  245. SPBTYPE 4 "CARD SPPR 1 [PLAY THAT CARD]
  246. PR []
  247. PR [A CARD CONSISTS OF A RANK:]
  248. SPBPR 3 [A 2 3 4 5 6 7 8 9 10 J Q K]
  249. PR [FOLLOWED BY A SUIT:]
  250. SPBPR 3 [H S D C]
  251. PR []
  252. PR [IF YOU MAKE A MISTAKE,]
  253. SPPR 3 [HIT THE SPACE BAR.]
  254. PR []
  255. PR [TO MOVE AN ENTIRE STACK,]
  256. SPPR 3 [HIT THE SHIFTED STACK NUMBER:]
  257. SPBTYPE 5 [! @ # $ % ^ &] SPPR 1 [FOR STACKS]
  258. SPPR 5 [1 2 3 4 5 6 7]
  259. PR []
  260. END
  261.  
  262. TO INVTYPE :TEXT
  263. TYPE STANDOUT :TEXT
  264. END
  265.  
  266. TO LOOP
  267. IF EMPTYP :DIGIT [SETCURSOR [1 22] SPACES 6 SETCURSOR [1 22]]
  268. PARSEKEY RC
  269. LOOP
  270. END
  271.  
  272. TO LPOP :STACK
  273. LOCAL "RESULT
  274. MAKE "RESULT LAST THING :STACK
  275. MAKE :STACK BL THING :STACK
  276. OUTPUT :RESULT
  277. END
  278.  
  279. TO LPUSH :THING :STACK
  280. MAKE :STACK LPUT :THING THING :STACK
  281. END
  282.  
  283. TO PARSEDIGIT :CHAR
  284. IF NOT EMPTYP :DIGIT [BELL STOP]
  285. MAKE "DIGIT :CHAR
  286. TYPE :CHAR
  287. END
  288.  
  289. TO PARSEKEY :CHAR
  290. IF MEMBERP :CHAR [1 2 3 4 5 6 7 8 9 A J Q K] [PARSEDIGIT :CHAR STOP]
  291. IF EQUALP :CHAR "0 [PARSEZERO STOP]
  292. IF MEMBERP :CHAR [H S D C] [PARSESUIT :CHAR STOP]
  293. IF MEMBERP :CHAR [+ =] [HAND3 STOP]
  294. IF EQUALP :CHAR "R [REDISPLAY STOP]
  295. IF EQUALP :CHAR "? [HELP STOP]
  296. IF EQUALP :CHAR "P [PLAYPILE STOP]
  297. IF MEMBERP :CHAR [! @ # $ % ^ &] [PLAYSTACK :CHAR [! @ # $ % ^ &] STOP]
  298. IF EQUALP :CHAR "| | [RUBOUT STOP]
  299. IF EQUALP :CHAR "\( [CHEAT STOP]
  300. BELL
  301. END
  302.  
  303. TO PARSESUIT :CHAR
  304. IF EMPTYP :DIGIT [BELL STOP]
  305. IF EQUALP :DIGIT 1 [MAKE "DIGIT "A]
  306. IF EQUALP :CHAR "H [MAKE "CHAR :HEART]
  307. IF EQUALP :CHAR "S [MAKE "CHAR :SPADE]
  308. IF EQUALP :CHAR "D [MAKE "CHAR :DIAMOND]
  309. IF EQUALP :CHAR "C [MAKE "CHAR :CLUB]
  310. TYPE :CHAR
  311. wait 0
  312. MAKE "CARD WORD :DIGIT :CHAR
  313. SETEMPTY "DIGIT
  314. FINDCARD
  315. IF NOT EMPTYP :WHERE [PLAYCARD]
  316. END
  317.  
  318. TO PARSEZERO
  319. IF NOT EQUALP :DIGIT 1 [BELL STOP]
  320. MAKE "DIGIT 10
  321. TYPE 0
  322. END
  323.  
  324. TO PLAYCARD
  325. SETEMPTY "ONTO
  326. IF NOT COVEREDP [CHECKTOP]
  327. CHECKONTO 7
  328. IF EMPTYP :ONTO [BELL STOP]
  329. IFELSE (COUNT :ONTO) > 1 [ASKWHICH] [MAKE "ONTO FIRST :ONTO]
  330. RUN :WHERE
  331. RUN :ONTO
  332. SETEMPTY "DIGIT
  333. END
  334.  
  335. TO PLAYONTO :NUM [:row 5+count thing shown :num] [:col -4+5*:num]
  336. IF EMPTYP :CARDS [STOP]
  337. local "card
  338. make "card pop "cards
  339. PUSH :CARD SHOWN :NUM
  340. setcursor list :col :row
  341. carddis :card
  342. (PLAYONTO :NUM :row+1 :col)
  343. END
  344.  
  345. TO PLAYPILE
  346. IF EMPTYP :PILE [BELL STOP]
  347. IF NOT EMPTYP :DIGIT [BELL STOP]
  348. MAKE "CARD LAST :PILE
  349. MAKE "WHERE [REMPILE]
  350. CARDDIS :CARD
  351. PLAYCARD
  352. END
  353.  
  354. TO PLAYSTACK :WHICH :LIST
  355. IF NOT EMPTYP :DIGIT [BELL STOP]
  356. PLAYSTACK1 :WHICH :LIST 1
  357. END
  358.  
  359. TO PLAYSTACK1 :WHICH :LIST :NUM
  360. IF EQUALP :WHICH FIRST :LIST [PLAYSTACK2 :NUM STOP]
  361. PLAYSTACK1 :WHICH BF :LIST :NUM+1
  362. END
  363.  
  364. TO PLAYSTACK2 :NUM
  365. IF STACKEMPTYP SHOWN :NUM [BELL STOP]
  366. MAKE "CARD LAST THING SHOWN :NUM
  367. MAKE "WHERE SE "REMSHOWN :NUM
  368. CARDDIS :CARD
  369. PLAYCARD
  370. END
  371.  
  372. TO PLAYTOP :SUIT
  373. SETTOP :SUIT RANK :CARD
  374. DISTOP :SUIT
  375. END
  376.  
  377. TO PUSH :THING :STACK
  378. MAKE :STACK FPUT :THING THING :STACK
  379. END
  380.  
  381. TO RANK :CARD
  382. OUTPUT BL :CARD
  383. END
  384.  
  385. TO REDISPLAY
  386. CT
  387. DISSTACKS 7
  388. DISTOP :HEART
  389. DISTOP :SPADE
  390. DISTOP :DIAMOND
  391. DISTOP :CLUB
  392. DISPILE
  393. DISHAND
  394. SETCURSOR [1 22]
  395. SETEMPTY "DIGIT
  396. END
  397.  
  398. TO REDTYPE :WORD
  399. TYPE :WORD
  400. END
  401.  
  402. TO REMOVE :NUM :LIST
  403. IF :NUM = 1 [OUTPUT BF :LIST]
  404. OP FPUT FIRST :LIST REMOVE :NUM-1 BF :LIST
  405. END
  406.  
  407. TO REMPILE
  408. MAKE "CARDS (LIST (LPOP "PILE))
  409. DISPILE
  410. END
  411.  
  412. TO REMSHOWN :NUM
  413. SETEMPTY "CARDS
  414. REMSHOWN1 :NUM 1 (COUNT THING SHOWN :NUM)
  415. IF STACKEMPTYP SHOWN :NUM [TURNUP :NUM DISSTACK :NUM]
  416. END
  417.  
  418. TO REMSHOWN1 :NUM :DEPTH :LENGTH
  419. PUSH (SPOP SHOWN :NUM) "CARDS
  420. IF EQUALP :CARD FIRST :CARDS ~
  421.    [REMSHOWN2 :DEPTH (5+:LENGTH-:DEPTH) (-4+5*:NUM) STOP]
  422. REMSHOWN1 :NUM :DEPTH+1 :LENGTH
  423. END
  424.  
  425. TO REMSHOWN2 :DEPTH :ROW :COL
  426. IF :DEPTH = 0 [STOP]
  427. SETCURSOR LIST :COL :ROW
  428. SPACES 3
  429. REMSHOWN2 :DEPTH-1 :ROW+1 :COL
  430. END
  431.  
  432. TO RUBOUT
  433. SETCURSOR [1 22]
  434. SPACES 4
  435. SETCURSOR [1 22]
  436. SETEMPTY "DIGIT
  437. END
  438.  
  439. TO SETEMPTY :STACK
  440. MAKE :STACK []
  441. END
  442.  
  443. TO SETTOP :SUIT :VALUE
  444. MAKE (WORD "TOP :SUIT) :VALUE
  445. END
  446.  
  447. TO SHOWN :NUM
  448. OUTPUT WORD "SHOWN :NUM
  449. END
  450.  
  451. TO SHUFFLE :LEN :array
  452. if :len=0 [op arraytolist :array]
  453. LOCAL [choice temp]
  454. make "choice random :len
  455. make "temp item :choice :array
  456. setitem :choice :array item :len-1 :array
  457. setitem :len-1 :array :temp
  458. OP shuffle :len-1 :array
  459. END
  460.  
  461. TO SOLITAIRE
  462. INSTRUCT
  463. PR [SHUFFLING, PLEASE WAIT...]
  464. MAKE "HEART "H
  465. MAKE "SPADE "S
  466. MAKE "DIAMOND "D
  467. MAKE "CLUB "C
  468. MAKE "HAND SHUFFLE 52 DECK
  469. SETEMPTY "PILE
  470. INITSTACKS 7
  471. MAKE "REDS LIST :HEART :DIAMOND
  472. SETTOP :HEART "
  473. SETTOP :SPADE "
  474. SETTOP :DIAMOND "
  475. SETTOP :CLUB "
  476. REDISPLAY
  477. LOOP
  478. END
  479.  
  480. TO SPACES :NUM
  481. REPEAT :NUM [TYPE "| |]
  482. END
  483.  
  484. TO SPBPR :SPACES :TEXT
  485. SPBTYPE :SPACES :TEXT
  486. PR []
  487. END
  488.  
  489. TO SPBTYPE :SPACES :TEXT
  490. SPACES :SPACES
  491. INVTYPE :TEXT
  492. END
  493.  
  494. TO SPOP :STACK
  495. LOCAL "RESULT
  496. MAKE "RESULT FIRST THING :STACK
  497. MAKE :STACK BF THING :STACK
  498. OUTPUT :RESULT
  499. END
  500.  
  501. TO SPPR :SPACES :TEXT
  502. SPACES :SPACES
  503. PR :TEXT
  504. END
  505.  
  506. TO STACKEMPTYP :NAME
  507. OUTPUT EMPTYP THING :NAME
  508. END
  509.  
  510. TO SUIT :CARD
  511. OUTPUT LAST :CARD
  512. END
  513.  
  514. TO TOP :SUIT
  515. OUTPUT THING WORD "TOP :SUIT
  516. END
  517.  
  518. TO TURNUP :NUM
  519. SETEMPTY SHOWN :NUM
  520. IF STACKEMPTYP HIDDEN :NUM [STOP]
  521. PUSH (SPOP HIDDEN :NUM) SHOWN :NUM
  522. END
  523.  
  524.